package niuke;

/**
 * 汇编语言中有一种移位指令叫做循环左移（ROL），现在有个简单的任务，就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S，
 * 请你把其循环左移K位后的序列输出。例如，字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果，即“XYZdefabc”。是不是很简单？OK，搞定它！
 */
public class LeftRotateString {
    private <T> void reverse(T[] array, int start, int end) {
        T temp;
        while (start < end) {
            temp = array[start];
            array[start] = array[end];
            array[end] = temp;
            start++;
            end--;
        }
    }

    /** 假设字符串abcdef，n=3，设X=abc，Y=def，所以字符串可以表示成XY，如
     * 题干，问如何求得YX。假设X的翻转为XT，XT=cba，同理YT=fed，那么YX=(XTYT)T，三次翻转后可得结果
     * @param str
     * @param n
     * @return
     */
    public String leftRotateString(String str, int n) {
        Character[] charArray = new Character[str.length()];
        for (int i = 0; i < str.length(); i++) {
            charArray[i] = str.charAt(i);
        }
        if (str == null || str.length() == 0)
            return str;
        reverse(charArray, 0, n - 1);
        reverse(charArray, n, str.length() - 1);
        reverse(charArray, 0, str.length() - 1);
        StringBuilder stringBuilder = new StringBuilder();
        for (int i=0;i<charArray.length;i++) {
            stringBuilder.append(charArray[i]);
        }
        return stringBuilder.toString();
    }

    public static void main(String[] args) {
        LeftRotateString leftRotateString = new LeftRotateString();
        System.out.println(leftRotateString.leftRotateString("abcdef",3));
    }
}
